/**
 * FileName: LoginController
 * Author: TangZaoBang
 * Date: 2023/06/05 13:09
 * Description: 角色控制器
 * <p>
 * History:
 * <author> TangZaoBang
 * <time> 2023/06/05 13:09
 * <version> 1.0.0
 * <desc> 版本描述
 */
package com.sd365.permission.centre.api.controller;
import com.sd365.common.core.common.api.CommonPage;
import com.sd365.common.log.api.annotation.ApiLog;
import com.sd365.common.util.BeanUtil;
import com.sd365.permission.centre.api.RoleApi;

import com.sd365.permission.centre.entity.Node;
import com.sd365.permission.centre.entity.Role;
import com.sd365.permission.centre.pojo.dto.*;
import com.sd365.permission.centre.pojo.query.RoleQuery;
import com.sd365.permission.centre.pojo.query.UserQuery;
import com.sd365.permission.centre.pojo.vo.ResourceVO;
import com.sd365.permission.centre.pojo.vo.RoleCompanyVO;
import com.sd365.permission.centre.pojo.vo.RoleVO;
import com.sd365.permission.centre.service.RoleService;
import io.swagger.annotations.ApiParam;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.CrossOrigin;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestController;

import javax.validation.Valid;
import javax.validation.constraints.NotNull;
import java.util.List;

/**
 * @Class RoleController
 * @Description 角色管理controller 主要包含 角色的增删除改查以及角色和资源绑定，角色和用户绑定
 * @Author Administrator
 * @Date 2023-02-26  10:15
 * @version 1.0.0
 */
@CrossOrigin
@RestController
public class RoleController implements RoleApi {
    /**
     * 角色服务类
     */
    @Autowired
    private RoleService roleService;

    /**
     * 在系统启动时候将初始化角色和资源的关系，主要为网关鉴权服务
     * @author TangZaoBang
     * @date 2023/06/08 21:05
     * @param role 不同的角色初始化不同的资源到内存
     * @return java.lang.Boolean   成功则true 否则false
     */
    @Override
    public Boolean initRoleResourceRedis(@NotNull @ApiParam(name = "role",type = "Role",required = true) Role role) {
        return roleService.loadRoleResource2Cache(role);
    }



    /**
     * 为角色分配资源 支持选择多个角色统一分配资源
     * @author TangZaoBang
     * @date 2023/06/08 21:06
     * @param roleResourceDTO 对象包含角色id列表和资源列表 为必须填写
     * @return java.lang.Boolean 成功则true 否则false 异常则被全局统一异常捕获
     */
    @ApiLog
    @Override
    public Boolean assignResource(@NotNull @Valid @RequestBody RoleResourceDTO roleResourceDTO) {
        return roleService.assignResource(roleResourceDTO);
    }

    /**
     * 为角色分配用户，因为涉及多条插入记得启动事务管理，如果您的实现方式是
     * 直接单条依据批量插入那请忽略事务
     * @author TangZaoBang
     * @date 2023/06/08 21:18
     * @param userRoleDTO 当前勾选的用户以及从用户查询对话框多选的用户
     * @return java.lang.Boolean 成功则true 否则false 异常则被全局统一异常捕获
     */
    @ApiLog
    @Override
    public Boolean assignUser(@NotNull @Valid @RequestBody UserRoleDTO userRoleDTO) {
        return roleService.assignUser(userRoleDTO);
    }

   /**
    * 查询角色表中包含的公司
    * @author TangZaoBang
    * @date 2023/06/08 21:24
    * @return java.util.List<com.sd365.permission.centre.entity.Node>
    */
    @ApiLog
    @Override
    public List<Node> selectCompany() {
        return roleService.selectCompany();
    }

    /**
     * 增加角色,允许不带资源列表，后续用户通过assignRoleResource接口增加资源
     * @author TangZaoBang
     * @date 2023/06/08 21:26
     * @param roleDTO 角色DTO 必须包含名字 和code
     * @return java.lang.Boolean 成功则true 否则false 异常则被全局统一异常捕获
     */
    @ApiLog
    @Override
    public Boolean add(@NotNull @Valid @RequestBody RoleDTO roleDTO) {
        return roleService.add(roleDTO);
    }

    /**
     *  删除角色，同时删除角色对应资源
     * @author TangZaoBang
     * @date 2023/06/08 21:28
     * @param id 角色id
     * @param version  角色记录版本
     * @return true成功 false失败 如果内部删除主表和明细表失败则引发异常
     */
    @ApiLog
    @Override
    public Boolean removeByIdAndVersion(@ApiParam(value = "当前行id", required = true) @NotNull Long id,
                                        @ApiParam(value = "当前行版本", required = true)@NotNull Long version) {
        return roleService.removeByIdAndVersion(id, version);
    }

    @ApiLog
    @Override
    public Boolean batchRemove(@NotNull @Valid @RequestBody IdVersion[] idVersions) {
        return roleService.batchRemove(idVersions);
    }

    @ApiLog
    @Override
    public Boolean updateRole(@NotNull @Valid @RequestBody RoleDTO roleDTO) {
        return roleService.modify(roleDTO) != null;
    }

    @ApiLog
    @Override
    public RoleDTO copyRole(@NotNull  Long id) {
        return roleService.copy(id);
    }

    @ApiLog
    @Override
    public CommonPage<RoleDTO> commonQuery(@NotNull RoleQuery roleQuery) {
        //执行查询
        return  roleService.commonQuery(roleQuery);
    }

    @ApiLog
    @Override
    public CommonPage<UserDTO> commonQueryUser(@NotNull UserQuery userQuery) {
        return  roleService.commonQueryUser(userQuery);
    }

    /**
     * 通过角色id返回角色对象
     * @author TangZaoBang
     * @date 2023/06/08 22:02
     * @param id 角色id
     * @return com.sd365.permission.centre.pojo.vo.RoleVO 角色VO对象用于编辑角色需要展示角色数据调用
     */
    @ApiLog
    @Override
    public RoleVO queryRoleById(@NotNull  @PathVariable Long id) {
        RoleDTO roleDTO = roleService.queryById(id);
        return roleDTO!=null ? BeanUtil.copy(roleDTO, RoleVO.class): new RoleVO();
    }

    @Override
    public RoleVO queryUserResource(@NotNull Long id) {
        RoleDTO roleDTO = roleService.queryUserResource(id);
        if (roleDTO != null) {
            RoleVO roleVO = BeanUtil.copy(roleDTO, RoleVO.class);
            roleVO.setResourceVOS( BeanUtil.copyList(roleDTO.getResourceDTOS(), ResourceVO.class));
            return roleVO;
        } else{ return new RoleVO();}
    }

    @Override
    public RoleCompanyVO queryRoleCompanyById(@NotNull Long id) {
        return roleService.queryRoleCompanyById(id);
    }

    @Override
    public Boolean modifyRoleCompany(@NotNull @Valid @RequestBody RoleCompanyDTO roleCompanyDTO) {
        return roleService.modifyRoleCompany(roleCompanyDTO);
    }
}
